import re

def parse_floors(s, min_floor=1, max_floor=3):
    """
    解析楼层字符串，提取所有在有效范围内的楼层数字。
    只返回 min_floor 到 max_floor 范围内的楼层。
    如果没有找到任何有效楼层，返回空列表。
    
    参数:
    s (str): 楼层字符串
    min_floor (int): 最小楼层，默认1
    max_floor (int): 最大楼层，默认3
    
    返回:
    list: 解析出的楼层数字列表
    """
    # 预处理：替换常见楼层表示
    s = (s.replace('地下一层', '地下1').replace('地下二层', '地下2').replace('地下三层', '地下3')
         .replace('地下一', '地下1').replace('地下二', '地下2').replace('地下三', '地下3')
         .replace('一层', '1楼').replace('二层', '2楼').replace('三层', '3楼')
         .replace('四层', '4楼').replace('五层', '5楼').replace('叁层', '3楼')
         .replace('负一', '-1').replace('负二', '-2').replace('负三', '-3')
         .replace('第', '')  # 去掉"第"字
         .replace('B1', '-1').replace('B2', '-2').replace('B3', '-3')
         .replace('F1', '1').replace('F2', '2').replace('F3', '3')
         .replace('L1', '1').replace('L2', '2').replace('L3', '3'))

    # 中文数字到阿拉伯数字的映射
    chinese_to_digit = {
        '一': 1, '二': 2, '两': 2, '三': 3, '叁': 3, '四': 4, '五': 5,
        '六': 6, '七': 7, '八': 8, '九': 9, '十': 10, '零': 0
    }

    result = []

    # 用正则表达式提取所有数字（包括负数和范围）
    numbers = re.findall(r'[负\-]?\d+(?:[到至\-~][负\-]?\d+)?', s)

    for num_str in numbers:
        # 处理范围表示，如 "3-4", "2到5"
        if re.search(r'[到至\-~]', num_str):
            range_parts = re.split(r'[到至\-~]', num_str)
            if len(range_parts) == 2:
                try:
                    start = int(range_parts[0].replace('负', '-'))
                    end = int(range_parts[1].replace('负', '-'))
                    if start > end:
                        start, end = end, start
                    for floor in range(start, end + 1):
                        if min_floor <= floor <= max_floor and floor not in result:
                            result.append(floor)
                except ValueError:
                    continue
        else:
            # 处理单个数字
            try:
                floor_num = int(num_str.replace('负', '-'))
                if min_floor <= floor_num <= max_floor and floor_num not in result:
                    result.append(floor_num)
            except ValueError:
                continue

    # 查找中文数字（无论是否找到阿拉伯数字）
    floor_keywords = ['楼', '层', 'floor', 'f', 'l']
    for i, char in enumerate(s):
        if char in chinese_to_digit:
            is_near_keyword = False
            # 检查后面的字符（最多看3个字符）
            lookahead = min(3, len(s) - i - 1)
            for j in range(1, lookahead + 1):
                if s[i + j] in floor_keywords:
                    is_near_keyword = True
                    break
            # 检查前面的字符（最多看2个字符）
            if not is_near_keyword and i > 0:
                lookbehind = min(2, i)
                for j in range(1, lookbehind + 1):
                    if s[i - j] in floor_keywords:
                        is_near_keyword = True
                        break
            if is_near_keyword:
                floor_num = chinese_to_digit[char]
                if min_floor <= floor_num <= max_floor and floor_num not in result:
                    result.append(floor_num)

    # 去重并排序
    return sorted(list(set(result)))

def test_floor_parse():
    # 合并测试案例
    test_cases = [
        ("我们一路去二楼", [2]),
        ("我们一起去二楼和三楼", [2, 3]),
        ("上地下一楼", []),  # 超出范围
        ("3到4", [3]),  # 4超出范围
        ("第二楼、3楼和5楼8楼100楼", [2, 3]),  # 5,8,100超出范围
        ("去二楼、3楼和5楼8楼100楼", [2, 3]),  # 5,8,100超出范围
        ("去负一楼和三楼", [3]),  # 负一超出范围
        ("-2楼和3楼", [3]),  # -2超出范围
        ("一楼、二楼、三楼", [1, 2, 3]),
        ("十楼", []),  # 超出范围
        ("abc", []),  # 没有楼层信息
        ("我们一起", []),  # 没有楼层信息
        ("二楼会议室和三楼办公室", [2, 3]),
        ("叁层和四层", [3]),  # 4超出范围
        ("第一层和第二层", [1, 2]),
        ("B1和二楼", [2]),  # B1是-1，超出范围
        ("F1到F3会议室", [1, 2, 3]),
    ]

    print("解析结果：")
    for test, expected in test_cases:
        result = parse_floors(test)
        status = "通过" if result == expected else "失败"
        print(f"输入: '{test}' -> 结果: {result}, 期望: {expected}, 状态: {status}")

if __name__ == "__main__":
    test_floor_parse()